package com.cms.recursoshumanos.engine;

import com.cms.recursoshumanos.cache.CarritoCompraCache;
import com.cms.recursoshumanos.cache.ListaArticuloCache;
import com.cms.recursoshumanos.cache.ListaEventoCache;
import com.cms.recursoshumanos.cache.ListaModuloCache;
import com.cms.recursoshumanos.cache.ListaOcioCache;
import com.cms.recursoshumanos.cache.ListaReservacionCache;
import com.cms.recursoshumanos.cache.ListaTipoArticuloCache;
import com.cms.recursoshumanos.cache.ListaTipoEventoCache;
import com.cms.recursoshumanos.cache.ListaTipoMenuCache;
import com.cms.recursoshumanos.cache.ListaTipoReciboCache;
import com.cms.recursoshumanos.cache.MenuComidaCache;
import com.cms.recursoshumanos.cache.UserInfoCache;
import com.cms.recursoshumanos.json.object.JsonObjectAuthenticateUser;
import com.cms.recursoshumanos.json.object.JsonObjectGetAdiestramiento;
import com.cms.recursoshumanos.json.object.JsonObjectGetArticulosCatalogo;
import com.cms.recursoshumanos.json.object.JsonObjectGetBeneficiosAdministrativos;
import com.cms.recursoshumanos.json.object.JsonObjectGetCantVacaciones;
import com.cms.recursoshumanos.json.object.JsonObjectGetComidaComedor;
import com.cms.recursoshumanos.json.object.JsonObjectGetEstablecimientosOcio;
import com.cms.recursoshumanos.json.object.JsonObjectGetEstudio;
import com.cms.recursoshumanos.json.object.JsonObjectGetEventoSede;
import com.cms.recursoshumanos.json.object.JsonObjectGetFamiliar;
import com.cms.recursoshumanos.json.object.JsonObjectGetHospital;
import com.cms.recursoshumanos.json.object.JsonObjectGetMyUserDetails;
import com.cms.recursoshumanos.json.object.JsonObjectGetPlanillaBeneficio;
import com.cms.recursoshumanos.json.object.JsonObjectGetPlanillaVacaciones;
import com.cms.recursoshumanos.json.object.JsonObjectGetReciboPago;
import com.cms.recursoshumanos.json.object.JsonObjectGetReservacion;
import com.cms.recursoshumanos.json.object.JsonObjectGetSeguro;
import com.cms.recursoshumanos.json.object.JsonObjectGetTipoArticulo;
import com.cms.recursoshumanos.json.object.JsonObjectGetTipoEvento;
import com.cms.recursoshumanos.json.object.JsonObjectGetTipoMenu;
import com.cms.recursoshumanos.json.object.JsonObjectSetCompraArticulos;
import com.cms.recursoshumanos.json.object.JsonObjectSetReservaciones;
import com.cms.recursoshumanos.object.Adiestramiento;
import com.cms.recursoshumanos.object.Articulo;
import com.cms.recursoshumanos.object.ArticuloCarrito;
import com.cms.recursoshumanos.object.BeneficioAdministrativo;
import com.cms.recursoshumanos.object.Comida;
import com.cms.recursoshumanos.object.Contacto;
import com.cms.recursoshumanos.object.Empleado;
import com.cms.recursoshumanos.object.Estudio;
import com.cms.recursoshumanos.object.Evento;
import com.cms.recursoshumanos.object.Familiar;
import com.cms.recursoshumanos.object.Hospital;
import com.cms.recursoshumanos.object.MenuComida;
import com.cms.recursoshumanos.object.Ocio;
import com.cms.recursoshumanos.object.Poliza;
import com.cms.recursoshumanos.object.Recibo;
import com.cms.recursoshumanos.object.Reservacion;
import com.cms.recursoshumanos.object.SolicitudCompra;
import com.cms.recursoshumanos.object.list.ListaAdiestramiento;
import com.cms.recursoshumanos.object.list.ListaArticulo;
import com.cms.recursoshumanos.object.list.ListaBeneficioAdministrativo;
import com.cms.recursoshumanos.object.list.ListaContacto;
import com.cms.recursoshumanos.object.list.ListaEstudio;
import com.cms.recursoshumanos.object.list.ListaEvento;
import com.cms.recursoshumanos.object.list.ListaFamiliar;
import com.cms.recursoshumanos.object.list.ListaHospital;
import com.cms.recursoshumanos.object.list.ListaOcio;
import com.cms.recursoshumanos.object.list.ListaRecibo;
import com.cms.recursoshumanos.object.list.ListaReservacion;
import com.cms.recursoshumanos.object.list.ListaSolicitudCompra;
import com.cms.recursoshumanos.object.list.ListaTipoArticulo;
import com.cms.recursoshumanos.object.list.ListaTipoEvento;
import com.cms.recursoshumanos.object.list.ListaTipoMenu;
import com.cms.recursoshumanos.popup.AddCarritoPopUp;
import com.cms.recursoshumanos.popup.ArticuloSelectorPopUp;
import com.cms.recursoshumanos.popup.BeneficioAdmPopUp;
import com.cms.recursoshumanos.popup.EditCarritoPopUp;
import com.cms.recursoshumanos.popup.EstablecimientoSelectorPopUp;
import com.cms.recursoshumanos.popup.LoadingPopupScreen;
import com.cms.recursoshumanos.ui.MenuScreen;
import com.cms.recursoshumanos.ui.SplashScreen;
import com.cms.recursoshumanos.ui.acceso.LoginScreen;
import com.cms.recursoshumanos.ui.acceso.recuperacion.MainRecuperacionScreen;
import com.cms.recursoshumanos.ui.acceso.recuperacion.RecuperacionPasswordScreen;
import com.cms.recursoshumanos.ui.acceso.recuperacion.RecuperacionUsernameScreen;
import com.cms.recursoshumanos.ui.beneficios.BeneficioAdmInformacionScreen;
import com.cms.recursoshumanos.ui.beneficios.ListaBeneficioAdministrativoScreen;
import com.cms.recursoshumanos.ui.catalogo.DetailArticuloScreen;
import com.cms.recursoshumanos.ui.catalogo.ListaArticuloScreen;
import com.cms.recursoshumanos.ui.catalogo.ListaTipoArticuloScreen;
import com.cms.recursoshumanos.ui.catalogo.carrito.CarritoCompraScreen;
import com.cms.recursoshumanos.ui.catalogo.carrito.DetailArticuloCarritoScreen;
import com.cms.recursoshumanos.ui.catalogo.solicitud_compra.DetailSolicitudCompraScreen;
import com.cms.recursoshumanos.ui.catalogo.solicitud_compra.ListaSolicitudCompraScreen;
import com.cms.recursoshumanos.ui.directorio.DetailContactoScreen;
import com.cms.recursoshumanos.ui.directorio.ListaContactosDirectorioScreen;
import com.cms.recursoshumanos.ui.evento.DetailEventoScreen;
import com.cms.recursoshumanos.ui.evento.ListaEventosScreen;
import com.cms.recursoshumanos.ui.evento.ListaTipoEventosScreen;
import com.cms.recursoshumanos.ui.menu_comedor.DetailComidaScreen;
import com.cms.recursoshumanos.ui.menu_comedor.ListaComidaMenuScreen;
import com.cms.recursoshumanos.ui.menu_comedor.ListaTipoMenuScreen;
import com.cms.recursoshumanos.ui.ocio.DetailOcioScreen;
import com.cms.recursoshumanos.ui.ocio.ListaOcioScreen;
import com.cms.recursoshumanos.ui.ocio.reservacion.DetailReservacionScreen;
import com.cms.recursoshumanos.ui.ocio.reservacion.ListaReservacionScreen;
import com.cms.recursoshumanos.ui.ocio.reservacion.SetReservacionScreen;
import com.cms.recursoshumanos.ui.principal.PantallaBeneficiosScreen;
import com.cms.recursoshumanos.ui.principal.PantallaCatalogoScreen;
import com.cms.recursoshumanos.ui.principal.PantallaNominaScreen;
import com.cms.recursoshumanos.ui.principal.PantallaOcioScreen;
import com.cms.recursoshumanos.ui.principal.PantallaPrincipalScreen;
import com.cms.recursoshumanos.ui.principal.PantallaVacacionesMainScreen;
import com.cms.recursoshumanos.ui.user.ChangeUserInfoScreen;
import com.cms.recursoshumanos.ui.user.DetailUserScreen;
import com.cms.recursoshumanos.ui.user.adiestramiento.DetailAdiestramientoScreen;
import com.cms.recursoshumanos.ui.user.adiestramiento.ListaAdiestramientoScreen;
import com.cms.recursoshumanos.ui.user.estudio.DetailEstudioScreen;
import com.cms.recursoshumanos.ui.user.estudio.ListaEstudioScreen;
import com.cms.recursoshumanos.ui.user.familiar.DetailFamiliarScreen;
import com.cms.recursoshumanos.ui.user.familiar.ListaFamiliarScreen;
import com.cms.recursoshumanos.ui.user.poliza.DetailPolizaScreen;
import com.cms.recursoshumanos.ui.user.poliza.beneficiarios.ListaBeneficiaroScreen;
import com.cms.recursoshumanos.ui.user.poliza.carta_aval.CartaAvalSolScreen;
import com.cms.recursoshumanos.ui.user.poliza.carta_aval.InformacionCartaAvalScreen;
import com.cms.recursoshumanos.ui.user.poliza.hospital.DetailHospitalScreen;
import com.cms.recursoshumanos.ui.user.poliza.hospital.ListaHospitalScreen;
import com.cms.recursoshumanos.ui.user.recibo.DetailReciboScreen;
import com.cms.recursoshumanos.ui.user.recibo.ListaReciboScreen;
import com.cms.recursoshumanos.ui.user.recibo.ListaTipoReciboScreen;
import com.cms.recursoshumanos.ui.vacaciones.InformacionVacacionesScreen;
import com.cms.recursoshumanos.ui.vacaciones.PlanillaSolicitudVacacionesScreen;

import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.FontFamily;
import net.rim.device.api.ui.FontManager;
import net.rim.device.api.ui.Screen;
import net.rim.device.api.ui.TransitionContext;
import net.rim.device.api.ui.Ui;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.UiEngineInstance;
import net.rim.device.api.ui.container.MainScreen;

public class ScreenEngine extends MainScreen
{

	private static ScreenEngine instance = null;
	private UiApplication app;

	private boolean error = false;
	
    TransitionContext transitionContextIn;
    TransitionContext transitionContextOut;
    UiEngineInstance engine = Ui.getUiEngineInstance();
    
    private LoadingPopupScreen loadPopup;
    
    public static ScreenEngine getInstance() 
    {
    	if(instance == null)
    	{
    		instance = new ScreenEngine();
    	}
    	return instance;
    }
    
    private ScreenEngine() 
    {
       super(1);
    	this.app = UiApplication.getUiApplication();
        FontManager.getInstance().load("fonts/Eurosti.TTF", "Eurostyle", FontManager.APPLICATION_FONT);
        try 
        {
	        FontFamily typeface = FontFamily.forName("Eurostyle");
			
	        int width = Display.getWidth();
	        
	        Font myFont = typeface.getFont(Font.PLAIN, width/15);
			
	        Font.setDefaultFont(myFont);
        } 
        catch(Exception e) 
        {
        	//RecursosHumanosMain.log("Error cargando font");
        }

        
    }
    
    public void loadScreens() 
    {
    	

    	// Screens
    	LoginScreen.getInstance();
    	MenuScreen.getInstance();

    	// Cache
    	CarritoCompraCache.getInstance();
    	ListaArticuloCache.getInstance();
    	ListaEventoCache.getInstance();
    	ListaModuloCache.getInstance();
    	ListaOcioCache.getInstance();
    	ListaReservacionCache.getInstance();
    	ListaTipoArticuloCache.getInstance();
    	ListaTipoEventoCache.getInstance();
    	ListaTipoMenuCache.getInstance();
    	MenuComidaCache.getInstance();
    	UserInfoCache.getInstance();

    	
		// Json

    	JsonObjectAuthenticateUser.getInstance();
    	JsonObjectGetAdiestramiento.getInstance();
    	JsonObjectGetArticulosCatalogo.getInstance();
    	JsonObjectGetBeneficiosAdministrativos.getInstance(); 	
    	JsonObjectGetCantVacaciones.getInstance();
    	JsonObjectGetComidaComedor.getInstance();
    	JsonObjectGetEstablecimientosOcio.getInstance();
    	JsonObjectGetEstudio.getInstance();
    	JsonObjectGetEventoSede.getInstance();
    	JsonObjectGetFamiliar.getInstance();
    	JsonObjectGetHospital.getInstance();
    	JsonObjectGetMyUserDetails.getInstance();
    	JsonObjectGetPlanillaBeneficio.getInstance();
    	JsonObjectGetPlanillaVacaciones.getInstance();
    	JsonObjectGetReciboPago.getInstance();
    	JsonObjectGetReservacion.getInstance();
    	JsonObjectGetSeguro.getInstance();
    	JsonObjectGetTipoArticulo.getInstance();
    	JsonObjectGetTipoEvento.getInstance();
    	JsonObjectGetTipoMenu.getInstance();
    	JsonObjectSetCompraArticulos.getInstance();
    	JsonObjectSetReservaciones.getInstance();
    	
    	JsonObjectGetPlanillaVacaciones.getInstance();
    	JsonObjectGetSeguro.getInstance();
    }
    public void goPantallaTipoRecibo()
    {
    	pushScreen(ListaTipoReciboScreen.getInstance(ListaTipoReciboCache.getInstance().getListaTipoRecibo()));
    }
    public void goPantallaChangeUserInfo()
    {
    	pushScreen(ChangeUserInfoScreen.getInstance());
    }
    public void goPantallaRecuperacionUsername()
    {
    	pushScreen(RecuperacionUsernameScreen.getInstance());
    }
    public void goPantallaRecuperacionPassword()
    {
    	pushScreen(RecuperacionPasswordScreen.getInstance());
    }
    public void goPantallaMainRecuperacion()
    {
    	pushScreen(MainRecuperacionScreen.getInstance());
    }
    public void goPantallaInfoCartaAval()
    {
    	pushScreen(InformacionCartaAvalScreen.getInstance());
    }
    public void goPantallaInfoVacaciones()
    {
    	pushScreen(InformacionVacacionesScreen.getInstance());
    }
    public void goPantallaInfoBeneficioAdm(BeneficioAdministrativo elBeneficio)
    {
    	pushScreen(BeneficioAdmInformacionScreen.getInstance(elBeneficio));
    }
    public void goListaSolicitudCompra(ListaSolicitudCompra listado)
    {
    	pushScreen(ListaSolicitudCompraScreen.getInstance(listado));
    }
    public void goDetailSolicitudCompra(SolicitudCompra laSolicitud)
    {
    	pushScreen(DetailSolicitudCompraScreen.getInstance(laSolicitud));
    }
    public void goPantallaPrincipal()
    {
    	pushScreen(PantallaPrincipalScreen.getInstance());
    }
    public void goPantallaPrincipalVacaciones()
    {
    	pushScreen(PantallaVacacionesMainScreen.getInstance());
    }
    public void goPantallaPrincipalUsuario(Empleado elEmpleado)
    {
    	pushScreen(DetailUserScreen.getInstance(elEmpleado));
    }
    public void goPantallaPrincipalNomina()
    {
    	pushScreen(PantallaNominaScreen.getInstance());
    }
    public void goPantallaPrincipalBeneficios()
    {
    	pushScreen(PantallaBeneficiosScreen.getInstance());
    }
    public void goPantallaPrincipalCatalogo()
    {
    	pushScreen(PantallaCatalogoScreen.getInstance());
    } 
    public void goPantallaPrincipalOcio()
    {
    	pushScreen(PantallaOcioScreen.getInstance());
    }
    
    public void goDetailContacto(Contacto elContacto)
    {
    	pushScreen(DetailContactoScreen.getInstance(elContacto));
    }
    public void goSolicitudCartaAval(Poliza laPoliza, Object[] listado_hospital, Object[] listado_familiar)
    {
    	CartaAvalSolScreen cartaavalpopup = new CartaAvalSolScreen(laPoliza,listado_hospital,listado_familiar);
    	pushScreen(cartaavalpopup);
    }
    public void goPopArticulo(Articulo elArticulo)
    {
    	ArticuloSelectorPopUp articuloPopUp = new ArticuloSelectorPopUp(elArticulo);
    	pushScreen(articuloPopUp);
    }
    public void goListaContacto(ListaContacto listado)
    {
    	pushScreen(ListaContactosDirectorioScreen.getInstance(listado));
    }
    public void goPlanillaVacaciones()
    {
    	pushScreen(PlanillaSolicitudVacacionesScreen.getInstance());
    }
    public void goSplash()
    {
    	pushScreen(new SplashScreen());
    }
    public void goEstablecimientoPopUp(Ocio elOcio)
    {
    	pushScreen(new EstablecimientoSelectorPopUp(elOcio));
    }
    public void goDetailRecibo(Recibo elRercibo)
    {
    	pushScreen(DetailReciboScreen.getInstance(elRercibo));
    }
    public void goListaRecibo(ListaRecibo listado)
    {
    	pushScreen(ListaReciboScreen.getInstance(listado));
    }
    public void goDetailFamiliar(Familiar elFamiliar)
    {
    	pushScreen(DetailFamiliarScreen.getInstance(elFamiliar));
    }
    public void goDetailHospital(Hospital elHospital)
    {
    	pushScreen(DetailHospitalScreen.getInstance(elHospital));
    }
    public void goListaHospital(ListaHospital listado)
    {
    	pushScreen(ListaHospitalScreen.getInstance(listado));
    }
    public void goPoliza(Poliza laPoliza)
    {
    	pushScreen(DetailPolizaScreen.getInstance(laPoliza));
    }
    public void goListaAdiestramiento(ListaAdiestramiento listado)
    {
    	pushScreen(ListaAdiestramientoScreen.getInstance(listado));
    }
    public void goListaEstudio(ListaEstudio listado)
    {
    	pushScreen(ListaEstudioScreen.getInstance(listado));
    }
   
    public void goDetailEstudio(Estudio elEstudio)
    {
    	pushScreen(DetailEstudioScreen.getInstance(elEstudio));	
    }
    public void goDetailAdiestramiento(Adiestramiento elAdiestramiento)
    {
    	pushScreen(DetailAdiestramientoScreen.getInstance(elAdiestramiento));
    }
    public void getDetailReservacion(Reservacion laReservacion)
    {
    	pushScreen(DetailReservacionScreen.getInstance(laReservacion));
    }
    public void goDetailOcioScreen(Ocio elOcio)
    {
    	pushScreen(DetailOcioScreen.getInstance(elOcio));
    }
    public void goListaReservacion(ListaReservacion listado)
    {
    	pushScreen(ListaReservacionScreen.getInstance(listado));
    }
    public void goListaOcio(ListaOcio listado)
    {
    	pushScreen(ListaOcioScreen.getInstance(listado));
    }
    public void goListaTipoArticulo(ListaTipoArticulo listado)
    {
    	pushScreen(ListaTipoArticuloScreen.getInstance(listado));
    }
    public void goListaTipoMenu(ListaTipoMenu listado)
    {
    	pushScreen(ListaTipoMenuScreen.getInstance(listado));
    }
    public void goDetailEvento(Evento elEvento)
    {
    	pushScreen(DetailEventoScreen.getInstance(elEvento));
    }
    public void goListaTipoEventosScreen(ListaTipoEvento listado)
    {
    	pushScreen(ListaTipoEventosScreen.getInstance(listado));
    }
    public void goListaEventosScreen(ListaEvento listado)
    {
    	pushScreen(ListaEventosScreen.getInstance(listado));
    }
    public void goProcesioBeneficoAdminsitrativo(BeneficioAdministrativo elBeneficio)
    {
    	BeneficioAdmPopUp beneficioPopUp = new BeneficioAdmPopUp(elBeneficio);
    	pushScreen(beneficioPopUp);
    }
    public void goBeneficiosAdministrativos(ListaBeneficioAdministrativo listado)
    {
    	pushScreen(ListaBeneficioAdministrativoScreen.getInstance(listado));
    }
    public void goVacacionesMainScreen()
    {
    	pushScreen(PantallaVacacionesMainScreen.getInstance());
    }
    public void goLoginScreen()
    {
    	pushScreen(LoginScreen.getInstance());
    }
    public void goEditCarritopopUp(ArticuloCarrito elArticulo, Screen elScreen)
    {
    	pushScreen(EditCarritoPopUp.getInstance(elArticulo, elScreen));
    }
    public void goDetailsArticuloCarrito(ArticuloCarrito elArticulo)
    {
    	pushScreen(DetailArticuloCarritoScreen.getInstance(elArticulo));
    }
    public void goSetReservacion(Ocio elOcio)
    {
    	pushScreen(SetReservacionScreen.getInstance(elOcio));
    }
    public void goAddCarritopopUp(Articulo elArticulo)
    {
    	pushScreen(AddCarritoPopUp.getInstance(elArticulo));
    }
    public void goCarritoCompra()
    {
    	pushScreen(CarritoCompraScreen.getInstance(CarritoCompraCache.getInstance().getListaArticulo()));
    }
    public void goDetailsArticulo(Articulo elArticulo)
    {
    	pushScreen(DetailArticuloScreen.getInstance(elArticulo));
    }
    public void goDetailsComida(Comida laComida)
    {
    	pushScreen(DetailComidaScreen.getInstance(laComida));
    }
    public void goInfoMyUser(Empleado elEmpleado)
    {
    	pushScreen(DetailUserScreen.getInstance(elEmpleado));
    }
    public void goMenu()
    {
    	pushScreen(MenuScreen.getInstance());
    }
    public void goListaFamilar(ListaFamiliar listado)
    {
    	pushScreen(ListaFamiliarScreen.getInstance(listado));
    }
    public void goListaBeneficiarios(ListaFamiliar listado)
    {
    	pushScreen(ListaBeneficiaroScreen.getInstance(listado));
    }
    public void goListaComida(MenuComida elMenu)
    {
    	pushScreen(ListaComidaMenuScreen.getInstance(elMenu));
    }
    public void goListaArticulo(ListaArticulo listado, int filtro)
    {
    	pushScreen(ListaArticuloScreen.getInstance(listado, filtro));
    }
    public boolean getError()
    {
    	return error;
    }
	public void showLoadingPopup(String message)
    {
    	if (loadPopup == null)
    	{
    		loadPopup = new LoadingPopupScreen();
    	}
	    loadPopup.setMessage(message);
	    if (!loadPopup.isDisplayed()){
	    	app.pushScreen(loadPopup);
	    }
    }
	public void hideLoadingPopup_Error()
    {
    	if (loadPopup.isDisplayed())
    	{
	    	UiApplication.getUiApplication().invokeLater(new Runnable() 
	    	{
	    		public void run() 
	    		{
		        	synchronized(UiApplication.getEventLock())
		        	{
		        		try 
		        		{
		        			loadPopup.close();
						} 
		        		catch (Exception e) 
		        		{
							e.printStackTrace();
						}
		        	}
	    		}
			});
    	}
    }
    
	public void hideLoadingPopup()
    {
    	if (app.getActiveScreen() == loadPopup && loadPopup.isDisplayed())
    	{
	    	UiApplication.getUiApplication().invokeLater(new Runnable() 
	    	{
	    		public void run() 
	    		{
		        	synchronized(UiApplication.getEventLock())
		        	{
		        		try 
		        		{
		        			loadPopup.close();
						} 
		        		catch (Exception e) 
		        		{
							e.printStackTrace();
						}
		        	}
	    		}
			});
    	}
    }
    public void pushScreen(Screen screen) {
    	if(app.getActiveScreen() != screen) 
    	{
	    	synchronized (UiApplication.getEventLock()) 
	    	{
	    		try 
	    		{
	    			app.pushScreen(screen);
	    		} 
	    		catch (RuntimeException re) 
	    		{
	    			screen.invalidate();
	    		}
	    	}
    	} 
    	else
    	{	
    		synchronized (UiApplication.getEventLock()) 
    		{
    			screen.invalidate();
	    	}
    	}
    }


    public void pushModalScreen(Screen screen) {
    	synchronized (UiApplication.getEventLock()) {
    		app.pushModalScreen(screen);
    	}
    }
        
    public void popScreen(Screen screen){
    	synchronized (UiApplication.getEventLock()) {
    		app.popScreen(screen);
    	}
    }
    
    
}

